all repos — caroster @ aa7e34b3fb18f1f2e4b57ddbafef5f68523acbd9

[Octree] Group carpool to your event https://caroster.io

frontend/pages/e/[uuid]/index.tsx (view raw)

  1import {useState, useReducer, PropsWithChildren} from 'react';
  2import Box from '@mui/material/Box';
  3import {getSession, useSession} from 'next-auth/react';
  4import TravelColumns from '../../../containers/TravelColumns';
  5import NewTravelDialog from '../../../containers/NewTravelDialog';
  6import VehicleChoiceDialog from '../../../containers/VehicleChoiceDialog';
  7import pageUtils from '../../../lib/pageUtils';
  8import EventLayout, {TabComponent} from '../../../layouts/Event';
  9import {
 10  EventByUuidDocument,
 11  FindUserVehiclesDocument,
 12  VehicleEntity,
 13  useFindUserVehiclesQuery,
 14} from '../../../generated/graphql';
 15import {getLocaleForLang} from '../../../lib/getLocale';
 16
 17interface Props {
 18  eventUUID: string;
 19  announcement?: string;
 20}
 21
 22const Page = (props: PropsWithChildren<Props>) => {
 23  return <EventLayout {...props} Tab={TravelsTab} />;
 24};
 25
 26const TravelsTab: TabComponent<Props> = () => {
 27  const session = useSession();
 28  const [openNewTravelDialog, setNewTravelDialog] = useState(false);
 29  const [openVehicleChoice, toggleVehicleChoice] = useReducer(i => !i, false);
 30  const [selectedVehicle, setSelectedVehicle] = useState<VehicleEntity>();
 31
 32  const isAuthenticated = session.status === 'authenticated';
 33  const {data} = useFindUserVehiclesQuery({
 34    skip: !isAuthenticated,
 35  });
 36  const vehicles = data?.me?.profile?.vehicles?.data || [];
 37
 38  const addTravelClickHandler =
 39    isAuthenticated && vehicles?.length != 0
 40      ? toggleVehicleChoice
 41      : () => setNewTravelDialog(true);
 42
 43  return (
 44    <Box>
 45      <TravelColumns showTravelModal={addTravelClickHandler} />
 46      <NewTravelDialog
 47        key={selectedVehicle?.id || 'noVehicle'}
 48        opened={openNewTravelDialog}
 49        toggle={() => setNewTravelDialog(false)}
 50        selectedVehicle={selectedVehicle}
 51      />
 52      <VehicleChoiceDialog
 53        open={openVehicleChoice}
 54        toggle={toggleVehicleChoice}
 55        setNewTravelDialog={setNewTravelDialog}
 56        setSelectedVehicle={setSelectedVehicle}
 57        vehicles={vehicles}
 58      />
 59    </Box>
 60  );
 61};
 62
 63export const getServerSideProps = pageUtils.getServerSideProps(
 64  async (context, apolloClient) => {
 65    const {uuid} = context.query;
 66    const {host = ''} = context.req.headers;
 67    const session = await getSession(context);
 68    let event = null;
 69
 70    // Fetch event
 71    try {
 72      const {data} = await apolloClient.query({
 73        query: EventByUuidDocument,
 74        variables: {uuid},
 75      });
 76      event = data?.eventByUUID?.data;
 77    } catch (error) {
 78      return {
 79        notFound: true,
 80      };
 81    }
 82
 83    // Fetch user vehicles
 84    if (session)
 85      await apolloClient.query({
 86        query: FindUserVehiclesDocument,
 87      });
 88
 89    const description = await getLocaleForLang(
 90      event?.attributes?.lang,
 91      'meta.description'
 92    );
 93
 94    return {
 95      props: {
 96        eventUUID: uuid,
 97        metas: {
 98          title: event?.attributes?.name || '',
 99          description,
100          url: `https://${host}${context.resolvedUrl}`,
101        },
102      },
103    };
104  }
105);
106
107export default Page;